package com.dcshop.demo.contract;

import com.dcshop.demo.dto.ProductContractDTO;
import com.github.ontio.common.Address;
import com.github.ontio.common.Helper;
import com.github.ontio.smartcontract.neovm.abi.AbiFunction;

/**
 * 产品合约调用
 */
public class ProductContract {


    /**
     * 查询链上产品
     *
     * @param productContractDTO 合约对象
     * @return 交易hash
     */
    public static Object queryProducts(ProductContractDTO productContractDTO) {

        //TODO 参数验证

        Object res = null;
        try {
            //执行合约
            AbiFunction function = productContractDTO.getInfo().getFunction(ContractUtils.QUERY_PRODUCT);
            function.setParamsValue(productContractDTO.getProductid());
            res = productContractDTO.getOntSdk().neovm().sendTransaction(Helper.reverse(ContractUtils.CONTRACT_ADDRESS), productContractDTO.getAccount(), productContractDTO.getPayAccount(),
                    ContractUtils.GASLIMIT, ContractUtils.GASPRICE, function, ContractUtils.PRE_EXEC);
        } catch (Exception e) {
            e.getMessage();
        }

        //TODO res解析


        return res;
    }

    /**
     * 评估通过产品，添加到链上
     *
     * @param productContractDTO 合约对象
     * @return 交易hash
     */
    public static Object addProducts(ProductContractDTO productContractDTO) {


        //TODO 参数验证


        Object res = null;
        try {
            //执行合约
            AbiFunction function = productContractDTO.getInfo().getFunction(ContractUtils.ADD_PRODUCT);
            function.setParamsValue(productContractDTO.getInfo(), productContractDTO.getAccount().getAddressU160().toArray());
            res = productContractDTO.getOntSdk().neovm().sendTransaction(Helper.reverse(ContractUtils.CONTRACT_ADDRESS), productContractDTO.getAccount(), productContractDTO.getPayAccount(),
                    ContractUtils.GASLIMIT, ContractUtils.GASPRICE, function, ContractUtils.PRE_EXEC);

        } catch (Exception e) {
            e.getMessage();
        }

        //TODO res解析

        return res;
    }


    /**
     * 产品转让
     *
     * @param productContractDTO 合约对象
     * @return 交易hash
     */
    public static Object transferProducts(ProductContractDTO productContractDTO) {

        Object res = null;
        try {
            AbiFunction function = productContractDTO.getInfo().getFunction(ContractUtils.TRANSFER_PRODUCT);
            byte[] to = Address.decodeBase58(productContractDTO.getToAddress()).toArray();
            function.setParamsValue(productContractDTO.getProductid(), to);
            res = productContractDTO.getOntSdk().neovm().sendTransaction(Helper.reverse(ContractUtils.CONTRACT_ADDRESS), productContractDTO.getAccount(), productContractDTO.getPayAccount(),
                    ContractUtils.GASLIMIT, ContractUtils.GASPRICE, function, ContractUtils.PRE_EXEC);
        } catch (Exception e) {
            e.getMessage();
        }

        //TODO res解析

        return res;
    }

}
